perm filename BRIDGE.SAI[ALS,ALS]1 blob sn#266407 filedate 1977-03-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "FOURSOME"
C00008 ENDMK
C⊗;
BEGIN "FOURSOME";
DEFINE ⊂="BEGIN",⊃="END",$="COMMENT";
DEFINE BOARDS="6",PLAYERS="16";
INTEGER ARRAY SETA[0:16,0:6];		$ Adopted array;
INTEGER ARRAY SETB[0:16,0:6];		$ Adopted array;
INTEGER ARRAY SET[0:16,0:6];		$ Trial array;
INTEGER ARRAY REPEAT[0:16,0:16];	$ Actual repeats;
INTEGER ARRAY HIT[0:16,0:16];		$ Trial repeats;
INTEGER ARRAY PARDNER[0:16,0:16];	$ Actual pardners;
INTEGER ARRAY NONO[0:16,0:16];		$ Trial pardners;
INTEGER H,I,J,K,L,M,N,P,Q,R,T,U,CHAN,HITMAX,HITNUM,HITMA2,HITNU2;
STRING TALLY;
CHAN←1;
FOR J←1 STEP 1 UNTIL 6 DO
⊂ "JJ"
  T←J; U←0;
  FOR I←1 STEP 1 UNTIL 16 DO
  ⊂ "II"
    IF SET[I,J]>0 THEN CONTINUE "II";
    T←T-1;  IF T=0 THEN T←4; IF T>4 THEN T←T-4;
    SET[I,J]←(T LSH 27);
WHILE TRUE DO
⊂ "LL"
      FOR K←1 STEP 1 UNTIL 16 DO
      ⊂ "KK"
        IF SET[K,J]>0 THEN CONTINUE "KK";
        IF NONO[I,K]=0 THEN DONE "KK";
      ⊃ "KK";
      IF K>16 THEN
      ⊂ FOR K←1 STEP 1 UNTIL 16 DO
         OUTSTR(CVOS(SET[K,J])&" ");
         DONE "JJ"; ⊃;
      IF K>16 THEN
        ⊂ FOR K←1 STEP 1 UNTIL 16 DO
          IF SET[K,J]=0 THEN DONE; ⊃;
    NONO[I,K]←NONO[K,I]←1;
        ARRTRAN(SETA,SET);	$ Save in case a repeat is needed;
        ARRTRAN(REPEAT,HIT);
        ARRTRAN(PARDNER,NONO);
        HITMA2←HITMAX;  HITNU2←HITNUM;
    IF L>HITMAX THEN HITMAX←L;  IF L>0 THEN HITNUM←HITNUM+1;
    SET[I,J]←SET[I,J]+(K LSH 18);  SET[K,J]←SET[K,J]+(T LSH 27)+(I LSH 18);
    FOR Q←0 STEP 1 UNTIL 16 DO
    ⊂ "QQ"
      FOR M←16 STEP -1 UNTIL 1 DO
      ⊂ "MM"
        IF SET[M,J]>0 THEN CONTINUE "MM";
        IF HIT[I,M]+HIT[J,M]≤Q THEN DONE "QQ";
      ⊃ "MM";
    ⊃ "QQ";
    HIT[I,M]←HIT[I,M]+1;	HIT[K,M]←HIT[K,M]+1;
    HIT[M,I]←HIT[M,I]+1;	HIT[M,K]←HIT[M,K]+1;
    IF Q>HITMAX THEN HITMAX←Q;  IF Q>0 THEN HITNUM←HITNUM+1;
    SET[I,J]←SET[I,J]+M LSH 9;  SET[K,J]←SET[K,J]+M LSH 9;
    SET[M,J]←SET[M,J]+(T LSH 27)+(I LSH 9)+K;
    FOR R←0 STEP 1 UNTIL 16 DO
    ⊂ "RR"
      FOR N←1 STEP 1 UNTIL 16 DO
      ⊂ "NN"
        IF NONO[M,N]>0 THEN CONTINUE "NN";
        IF SET[N,J]>0 THEN CONTINUE "NN";
        IF HIT[I,N]+HIT[K,N]≤R THEN DONE "RR";
      ⊃ "NN";
    ⊃ "RR";
    IF N>16 THEN
    ⊂ FOR N←1 STEP 1 UNTIL 16 DO
       IF SET[N,J]>0 THEN U←U+1;
      IF U>11 THEN
       FOR N←1 STEP 1 UNTIL 16 DO
        IF SET[N,J]=0 THEN DONE ; ⊃;
    IF N>16 THEN
    ⊂ ARRTRAN(SET,SETA);		$ Restore and repeat with a new K;
      ARRTRAN(HIT,REPEAT);
      ARRTRAN(NONO,PARDNER);
      HITMAX←HITMA2;  HITNUM←HITNU2;
      CONTINUE "LL";  ⊃;
    IF R>HITMAX THEN HITMAX←R;  IF R>0 THEN HITNUM←HITNUM+1;
    NONO[M,N]←NONO[N,M]←1;
    SET[I,J]←SET[I,J]+N;	SET[K,J]←SET[K,J]+N;
    SET[M,J]←SET[M,J]+N LSH 18;
    SET[N,J]←SET[N,J]+(T LSH 27)+(M LSH 18)+(I LSH 9)+K;
    HIT[I,N]←HIT[I,N]+1;	HIT[K,N]←HIT[K,N]+1;
    HIT[N,I]←HIT[N,I]+1;	HIT[N,K]←HIT[N,K]+1;
    DONE "LL";
⊃ "LL";
  ⊃ "II";
⊃ "JJ";
OUTSTR("MAX HIT = "&CVS(HITMAX)&" NUM HITS = "&CVS(HITNUM));
TALLY←"\|\\M1CORON;\M2BDI40;\M3NGR40;";
P←0;
FOR I←1 STEP 1 UNTIL 16 DO
⊂ "III"
  TALLY←TALLY&"\F1	Player No. "
&CVS(I)&'11&"Name"&'15&'12&'15&'12&"\F2Round	Table		With		Score"&'15&'12;
  FOR J←1 STEP 1 UNTIL 6 DO
  ⊂ "JJJ"
    T←LDB(POINT(9,SET[I,J],8));
    K←LDB(POINT(9,SET[I,J],17));
    TALLY←TALLY&CVS(J)&'11&'11&CVS(T)&'11&'11&CVS(K)&'15&'12;
  ⊃ "JJJ";
  TALLY←TALLY&"\F3"&'11&'11&'11&'11&'11&"Total"&'15&'12&'15&'12&'15&'12&'15&'12;
  P←P+1;  IF P=3 THEN
   ⊂ P←0;  TALLY←TALLY&'14; ⊃
⊃ "III";
TALLY←TALLY&CVS(HITNUM)&" opponent duplications with a maximum of "&CVS(HITMAX);
CLOSE(CHAN); OPEN(CHAN,"DSK",0,0,2,0,0,0); 
ENTER(CHAN,"TALLY[ALS,ALS]",0);
OUT(CHAN,TALLY);
CLOSE(CHAN);
⊃ "FOURSOME";